package com.simblog.common.utils;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.simblog.controller.UserController;

/** 
* Created by wjj on 2016年9月9日 
* 类说明 
*/
public class BeanUtils {
	
	private static final Logger logger = LoggerFactory.getLogger(BeanUtils.class);

	
	/**
	 * @作者：张剑 
	 * @创建时间：2014年3月6日 
     * 将一个 Map 对象转化为一个 JavaBean 
     * @param clazz 要转化的类型 
     * @param map 包含属性值的 map 
     * @return 转化出来的 JavaBean 对象 
     * @throws IntrospectionException 如果分析类属性失败 
     * @throws IllegalAccessException 如果实例化 JavaBean 失败 
     * @throws InstantiationException 如果实例化 JavaBean 失败 
     * @throws InvocationTargetException 如果调用属性的 setter 方法失败 
	 */
	public static <T> T toBean(Class<T> clazz, Map map) {  
        T obj = null;  
        try {  
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz);  
            obj = clazz.newInstance(); // 创建 JavaBean 对象  
  
            // 给 JavaBean 对象的属性赋值  
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();  
            for (int i = 0; i < propertyDescriptors.length; i++) {  
                PropertyDescriptor descriptor = propertyDescriptors[i];  
                String propertyName = descriptor.getName();  
                if (map.containsKey(propertyName)) {  
                    // 下面一句可以 try 起来，这样当一个属性赋值失败的时候就不会影响其他属性赋值。  
                	Object value = null;
                	try{
                		value = map.get(propertyName);  
                	}catch(Exception e){
                		logger.error("字段{}取值失败.",propertyName);  
                	}
                	if(value == null) 
                		continue;
                    if ("".equals(value)) {  
                        value = null;  
                    }  
                    Object[] args = new Object[1];  
                    args[0] = value;  
                    try {  
                        descriptor.getWriteMethod().invoke(obj, args);  
                    } catch (Exception e) {  
                        logger.error("字段{}映射失败.",propertyName);  
                    }  
                }  
            }  
        } catch (IllegalAccessException e) {  
            logger.error("实例化 JavaBean 失败");  
        } catch (IntrospectionException e) {  
        	logger.error("分析类属性失败");  
        } catch (IllegalArgumentException e) {  
        	logger.error("映射错误");  
        } catch (InstantiationException e) {  
        	logger.error("实例化 JavaBean 失败");  
        }  
        return (T) obj;  
    }  
	
}
